package com.hyg.module_third_party_demo.activity;

import android.graphics.Movie;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

import com.alibaba.android.arouter.facade.annotation.Route;
import com.hyg.lib_common.Base.BaseActivity;
import com.hyg.lib_common.constant.Constants;
import com.hyg.module_third_party_demo.R;
import com.hyg.module_third_party_demo.litepal.DataBaseHelper;
import com.hyg.module_third_party_demo.litepal.DataBaseUpdateLisenner;
import com.hyg.module_third_party_demo.litepal.DataModule.Option;

import org.litepal.LitePal;

import java.util.List;

/**
 * @description 数据库Demo页面
 * @author visitant
 * @time 2020/11/13 16:41
 */
@Route(path = Constants.PATH_ACTIVITY_MODULE_DEMO_LITEPAL)
public class LitePalActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_litepal);
    }

    public void checkVersion(View view) {            //检查版本监听
        checkAnswerInfo();
    }

    public void updateVersion(View view) {          //更新数据库监听
        updateDataBase();
    }

    public void addData(View view) {          //增
        Option option = new Option(
                "1",
                "每天1~2次",
                "120",
                "0",
                "1",
                "正常",
                "0",
                "1",
                "",
                "",
                "大小便、体质",
                "阴虚质",
                "0",
                "",
                "",
                ""
        );
        boolean result = option.save();
        Log.i(TAG, "addData: " + result);
    }

    public void deleteData(View view) {          //删
        // 删除单个记录，id=1
        LitePal.delete(Option.class, 1);
//
////       删除数据库中movie表的所有记录
//         LitePal.deleteAll(Option.class);
//
////       删除数据库movie表中Constitution1等于阴虚质的记录
//         LitePal.deleteAll(Option.class, "Constitution1 = ?" , "阴虚质");
    }

    public void changeData(View view) {          //改
//        方法一
//        //第一步，查找id为1的记录
        Option option = LitePal.find(Option.class, 1);
//        //第二步，改变某个字段的值
        option.setConstitution1("阴虚质");
//        //第三步，保存数据
        option.save();

//        方法二：
//        Option option = new Option();
//        option.setConstitution1("某人");
//        //直接更新id为1的记录
//        option.update(1);
//
//        方法三：
//        Option option = new Option();
//        option.setConstitution1("someone");
////      更新所有name为2Diots的记录,将director字段设为someone
//        option.updateAll("name = ?", "2Diots");
//
//        Option option = new Option();
//        option.setName("someone");
//        option.setDirector("someone");
////      将更新所有name为2Diots，director为gpf的记录name和director均改为someone
//        option.updateAll("name=? and director=?", "2Diots"，"gpf");
    }

    public void checkData(View view) {          //查
//      查找movie表的所有记录，返回值是一个泛型为Movie的List集合
        List<Option> allOptions = LitePal.findAll(Option.class);

//      查找movie表id为1的记录
//        Movie movie = LitePal.find(Movie.class, 1);

//      比如获取news表中的第一条数据
//        News firstNews = LitePal.findFirst(News.class);

// 获取News表中的最后一条数据
//        News lastNews = LitePal.findLast(News.class);

// 想把news表中id为1、3、5、7的数据都查出来
//        List<News> newsList = LitePal.findAll(News.class, 1, 3, 5, 7);
// 或者
//        long[] ids = new long[]{1, 3, 5, 7};
//        List<News> newsList = LitePal.findAll(News.class, ids);

//查找name为2Diots的记录,并且以时长作排序，where()方法接收任意个字符串参数，其中第一个参数用于进行条件约束，
//从第二个参数开始，都是用于替换第一个参数中的占位符的。那这个where()方法就对应了一条SQL语句中的where部分。
//        List<Movie> movies = LitePal.where("name = ?", "2Diots").order("duration").find(Movie.class);
// 但是这样会将news表中所有的列都查询出来，也许你并不需要那么多的数据，而是只要title和content这两列数据。那么也很简单，我们只要再增加一个连缀就行了，如下所示：
//        List<News> newsList = LitePal.select("title", "content")
//                .where("commentcount > ?", "0").find(News.class);
//将查询出的新闻按照发布的时间倒序排列，即最新发布的新闻放在最前面，那就可以这样写：
//        List<News> newsList = LitePal.select("title", "content")
//                .where("commentcount > ?", "0")
//                .order("publishdate desc").find(News.class);
//order()方法中接收一个字符串参数，用于指定查询出的结果按照哪一列进行排序，asc表示正序排序，desc表示倒序排序，因此order()方法对应了一条SQL语句中的order by部分。
//也许你并不希望将所有条件匹配的结果一次性全部查询出来，因为这样数据量可能会有点太大了，而是希望只查询出前10条数据，那么使用连缀同样可以轻松解决这个问题，代码如下所示：
//        List<News> newsList = LitePal.select("title", "content")
//                .where("commentcount > ?", "0")
//                .order("publishdate desc").limit(10).find(News.class);
//limit()方法接收一个整型参数，用于指定查询前几条数据，这里指定成10，意思就是查询所有匹配结果中的前10条数据。
//刚才我们查询到的是所有匹配条件的前10条新闻，那么现在我想对新闻进行分页展示，翻到第二页时，展示第11到第20条新闻,只需要再连缀一个偏移量就可以了，如下所示：
//        List<News> newsList = LitePal.select("title", "content")
//                .where("commentcount > ?", "0")
//                .order("publishdate desc").limit(10).offset(10)
//                .find(News.class);
//这里指定成10，就表示偏移十个位置，那么原来是查询前10条新闻的，偏移了十个位置之后，就变成了查询第11到第20条新闻了，如果偏移量是20，那就表示查询第21到第30条新闻

//查找所有年龄小于25岁的人
//        List<Person> person = LitePal.where("age < ?", 25).find(Person.class);

    }

    /**
     * @return 是否需要更新
     * @description 检查数据库版本
     * @author visitant
     * @time 2020/11/13 10:26
     */
    public boolean checkAnswerInfo() {
        return new DataBaseHelper(LitePalActivity.this).checkVersion();
    }

    /**
     * @description 更新数据库
     * @author visitant
     * @time 2020/11/13 10:36
     */
    public void updateDataBase() {
        DataBaseHelper helper = new DataBaseHelper(LitePalActivity.this);
        boolean result = helper.checkVersion();
        if (result) {
            helper.updateDataBase(new DataBaseUpdateLisenner() {
                @Override
                public void onStart() {
                }

                @Override
                public void onSuccess() {
                }

                @Override
                public void onFail(String fileName) {
                }
            });
        } else {
            Option option = LitePal.find(Option.class, 809);
        }
    }

}